/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[BitOperators.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package basicGrammar.operators;

/**
 * 位运算符<br/>
 * 
 * &, |, ^, ~, >>, >>>, << <br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class BitOperators {

	/**
	 * 位运算的操作数只能是整型char, byte, short, int, long<br/>
	 * 对于移动位大于该数据类型位数的时候, 先取模再移位例如: 对一个int类型的数据左移33位相当于左移1位<br/>
	 * 
	 * @param a
	 * @param b
	 */
	public static void bitOperator(int a, int b) {

		// 按位与, 两个操作数都为1时, 结果为1, 否则为0
		int c = a & b;
		System.out.println("按位与后: " + c);

		// 按位或, 两个操作数都为0时, 结果为0, 否则为1
		c = a | b;
		System.out.println("按位或后: " + c);

		// 按位异或, 两个操作数相同时结果为0, 不同时结果为1
		c = a ^ b;
		System.out.println("按位异或后: " + c);

		// 按位非, 如果操作数为0, 则变成1, 如果为1, 则变成0
		c = ~a;
		System.out.println("按位非后: " + c);

		// 左移 (<<) 低位补零, 高位舍弃, 其实质相当于乘以2的n次方
		c = a << b;
		System.out.println("左移后: " + c);

		// 右移 (>>) 如果值为正: 高位补零, 低位舍弃, 如果值为负, 高位补1, 低位舍弃, 其实质相当于除以2的n次方
		c = a >> b;
		System.out.println("右移后: " + c);

		// 无符号右移 (>>>) 不论正负与否, 高位补零, 低位舍弃
		c = a >>> b;
		System.out.println("无符号右移后: " + c);
	}

	public static void main(String[] args) {
		bitOperator(10, 2);
	}
}
